<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>中俊为 | we harmonyos</title>
    <meta name="generator" content="VuePress 1.9.7">
    <script>
          var _hmt = _hmt || [];
          (function() {
            var hm = document.createElement("script");
            hm.src = "https://hm.baidu.com/hm.js?39485dba914ae63b24732b6a90688f0b";
            var s = document.getElementsByTagName("script")[0];
            s.parentNode.insertBefore(hm, s);
          })();
      </script>
    <link rel="manifest" href="/manifest.webmanifest" crossorigin="use-credentials">
    <meta name="description" content="weharmonyos 鸿蒙论坛 鸿蒙注释 开源鸿蒙 鸿蒙源码 openharmony源码 HarmonyOS源码 HarmonyOS HarmonyOS生态 openharmony开发者文档 鸿蒙生态 鸿蒙系统 华为操作系统 鸿蒙研究站 开放原子开源基金会 百万汉字注解鸿蒙 百篇博客分析鸿蒙">
    <meta property="og:url" content="/blog/49.html">
    <meta property="og:site_name" content="中俊为 | we harmonyos">
    <meta property="og:description" content="本篇关键词：、、、 下载 &gt;&gt; 离线文档.鸿蒙内核源码分析(百篇博客分析.挖透鸿蒙内核).pdf.zip) 通讯机制相关篇为: v41.04 鸿蒙内核源码分析(通讯总览) | 内核跟人一样都喜欢八卦; v42.08 鸿蒙内核源码分析(自旋锁) | 死等丈夫归来的贞洁烈女; v43.05 鸿蒙内核源码分析(互斥锁) | 有你没她 相安无事; v44.0">
    <meta property="og:type" content="article">
    <meta property="og:locale" content="en-US">
    <meta name="twitter:card" content="summary_large_image">
    <meta name="twitter:image:alt" content="中俊为 | we harmonyos">
    <meta name="theme-color" content="#46bd87">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
    
    <link rel="preload" href="/assets/css/0.styles.087eb7d3.css" as="style"><link rel="preload" href="/assets/js/app.9a8b95d8.js" as="script"><link rel="preload" href="/assets/js/vendors~layout-Layout.c1e797d4.js" as="script"><link rel="preload" href="/assets/js/vendors~layout-Blog~layout-Layout~layout-NotFound.f75cf258.js" as="script"><link rel="preload" href="/assets/js/page--340c7ba8.2c9570cb.js" as="script"><link rel="prefetch" href="/assets/js/160.a8046d43.js"><link rel="prefetch" href="/assets/js/161.29f8564f.js"><link rel="prefetch" href="/assets/js/162.249ee491.js"><link rel="prefetch" href="/assets/js/163.c57d1577.js"><link rel="prefetch" href="/assets/js/164.7a788aaa.js"><link rel="prefetch" href="/assets/js/165.c333afb2.js"><link rel="prefetch" href="/assets/js/166.9bcb7cd6.js"><link rel="prefetch" href="/assets/js/layout-Blog.4a9781d1.js"><link rel="prefetch" href="/assets/js/layout-Layout.7e277e0b.js"><link rel="prefetch" href="/assets/js/layout-NotFound.9326b14e.js"><link rel="prefetch" href="/assets/js/layout-Slide.8dd861e4.js"><link rel="prefetch" href="/assets/js/page--00854288.e2bc8e8a.js"><link rel="prefetch" href="/assets/js/page--00f8db0a.b2a35fe6.js"><link rel="prefetch" href="/assets/js/page--03ad6df0.d48f4c19.js"><link rel="prefetch" href="/assets/js/page--04b12ba8.e8add78d.js"><link rel="prefetch" href="/assets/js/page--070d2528.d24cd503.js"><link rel="prefetch" href="/assets/js/page--086560f0.a6be2844.js"><link rel="prefetch" href="/assets/js/page--090ad32d.fc7da3c3.js"><link rel="prefetch" href="/assets/js/page--0c054030.2886024e.js"><link rel="prefetch" href="/assets/js/page--0d9507c8.a27dee03.js"><link rel="prefetch" href="/assets/js/page--10bd3330.b5165172.js"><link rel="prefetch" href="/assets/js/page--1233b0b2.b5caca9c.js"><link rel="prefetch" href="/assets/js/page--13650e88.61330a2b.js"><link rel="prefetch" href="/assets/js/page--14c850b1.d9a40c31.js"><link rel="prefetch" href="/assets/js/page--15752630.25f9c756.js"><link rel="prefetch" href="/assets/js/page--19150570.58df8995.js"><link rel="prefetch" href="/assets/js/page--19ecf128.130d012b.js"><link rel="prefetch" href="/assets/js/page--1c48eaa8.9a689e30.js"><link rel="prefetch" href="/assets/js/page--1d4dfe96.bd551921.js"><link rel="prefetch" href="/assets/js/page--1dccf870.03d7d9cc.js"><link rel="prefetch" href="/assets/js/page--2074d3c8.06bf5706.js"><link rel="prefetch" href="/assets/js/page--22213c96.e703257a.js"><link rel="prefetch" href="/assets/js/page--2284eb70.514124de.js"><link rel="prefetch" href="/assets/js/page--22d0cd48.11ea1522.js"><link rel="prefetch" href="/assets/js/page--252cc6c8.f9acae83.js"><link rel="prefetch" href="/assets/js/page--2624cab0.4535fea2.js"><link rel="prefetch" href="/assets/js/page--269ff8f9.012e8ae6.js"><link rel="prefetch" href="/assets/js/page--26fcb668.35b2da5d.js"><link rel="prefetch" href="/assets/js/page--2958afe8.216913bc.js"><link rel="prefetch" href="/assets/js/page--2adcbdb0.6dcb4c27.js"><link rel="prefetch" href="/assets/js/page--2bb4a968.aac31797.js"><link rel="prefetch" href="/assets/js/page--2d849908.7bb4e817.js"><link rel="prefetch" href="/assets/js/page--2e10a2e8.42bef48d.js"><link rel="prefetch" href="/assets/js/page--2f94b0b0.0c993df5.js"><link rel="prefetch" href="/assets/js/page--2fe09288.77769dcb.js"><link rel="prefetch" href="/assets/js/page--323c8c08.254a5f78.js"><link rel="prefetch" href="/assets/js/page--33348ff0.a5f99eb0.js"><link rel="prefetch" href="/assets/js/page--34988588.8c8d0363.js"><link rel="prefetch" href="/assets/js/page--36687528.67d84e0d.js"><link rel="prefetch" href="/assets/js/page--37d6dfd6.88e9cd42.js"><link rel="prefetch" href="/assets/js/page--37ec82f0.5419c82d.js"><link rel="prefetch" href="/assets/js/page--37f7cf15.65f72e55.js"><link rel="prefetch" href="/assets/js/page--38c46ea8.5d5150f9.js"><link rel="prefetch" href="/assets/js/page--3a945e48.bf9758fb.js"><link rel="prefetch" href="/assets/js/page--3ab2204c.e08d6316.js"><link rel="prefetch" href="/assets/js/page--3b206828.d83e3926.js"><link rel="prefetch" href="/assets/js/page--3ca475f0.49e5acce.js"><link rel="prefetch" href="/assets/js/page--3cf057c8.8364331d.js"><link rel="prefetch" href="/assets/js/page--3f4c5148.587a8360.js"><link rel="prefetch" href="/assets/js/page--40445530.486bb516.js"><link rel="prefetch" href="/assets/js/page--411c40e8.2eedba0e.js"><link rel="prefetch" href="/assets/js/page--41a84ac8.f4a360a3.js"><link rel="prefetch" href="/assets/js/page--4220f8b5.19b4371f.js"><link rel="prefetch" href="/assets/js/page--43783a68.4faf0866.js"><link rel="prefetch" href="/assets/js/page--44fc4830.a160662c.js"><link rel="prefetch" href="/assets/js/page--45d433e8.560fef87.js"><link rel="prefetch" href="/assets/js/page--47a42388.052314b4.js"><link rel="prefetch" href="/assets/js/page--47d07816.66731286.js"><link rel="prefetch" href="/assets/js/page--48302d68.8d6493cf.js"><link rel="prefetch" href="/assets/js/page--49b43b30.e3684736.js"><link rel="prefetch" href="/assets/js/page--4a001d08.47f7ec45.js"><link rel="prefetch" href="/assets/js/page--4c5c1688.b7ec1f32.js"><link rel="prefetch" href="/assets/js/page--4d541a70.ee807705.js"><link rel="prefetch" href="/assets/js/page--4e2c0628.4f7105a4.js"><link rel="prefetch" href="/assets/js/page--4eb81008.725d26fe.js"><link rel="prefetch" href="/assets/js/page--5087ffa8.dac2aae0.js"><link rel="prefetch" href="/assets/js/page--520c0d70.2beedefb.js"><link rel="prefetch" href="/assets/js/page--52e3f928.2645087c.js"><link rel="prefetch" href="/assets/js/page--53cd0b44.96d4a285.js"><link rel="prefetch" href="/assets/js/page--54eb2c5e.27eb702b.js"><link rel="prefetch" href="/assets/js/page--553ff2a8.fba8ee4f.js"><link rel="prefetch" href="/assets/js/page--5686ab01.547b633c.js"><link rel="prefetch" href="/assets/js/page--56c40070.4e35708a.js"><link rel="prefetch" href="/assets/js/page--570fe248.2b301b36.js"><link rel="prefetch" href="/assets/js/page--596bdbc8.c74cd724.js"><link rel="prefetch" href="/assets/js/page--5a63dfb0.bbd49a9b.js"><link rel="prefetch" href="/assets/js/page--5bc7d548.eda26865.js"><link rel="prefetch" href="/assets/js/page--5f1bd2b0.e02cf88d.js"><link rel="prefetch" href="/assets/js/page--5ff3be68.b2b0e76e.js"><link rel="prefetch" href="/assets/js/page--624fb7e8.666fdc84.js"><link rel="prefetch" href="/assets/js/page--63d3c5b0.b587d38f.js"><link rel="prefetch" href="/assets/js/page--68d79a88.86f62e4d.js"><link rel="prefetch" href="/assets/js/page--6c2b97f0.ed46abea.js"><link rel="prefetch" href="/assets/js/page--6cc6a596.b3827451.js"><link rel="prefetch" href="/assets/js/page--6ea7a148.61a9bc10.js"><link rel="prefetch" href="/assets/js/page--70e38af0.eb8ffc53.js"><link rel="prefetch" href="/assets/js/page--7180d470.73a3a20e.js"><link rel="prefetch" href="/assets/js/page--752f83e8.d5c31640.js"><link rel="prefetch" href="/assets/js/page--778b7d68.5e8e5ea9.js"><link rel="prefetch" href="/assets/js/page--7bb76688.53e305e3.js"><link rel="prefetch" href="/assets/js/page--7c59a86a.ecf88c30.js"><link rel="prefetch" href="/assets/js/page--7df35030.cfa388f4.js"><link rel="prefetch" href="/assets/js/page--7e136008.230e9a15.js"><link rel="prefetch" href="/assets/js/page--89935db0.f79f9e25.js"><link rel="prefetch" href="/assets/js/page--96a322f0.412d537f.js"><link rel="prefetch" href="/assets/js/page--9b5b15f0.a5231547.js"><link rel="prefetch" href="/assets/js/page--a3b2e830.f4ba68fa.js"><link rel="prefetch" href="/assets/js/page--a86adb30.ec08486b.js"><link rel="prefetch" href="/assets/js/page--ad22ce30.4872eca4.js"><link rel="prefetch" href="/assets/js/page--b0c2ad70.8637057e.js"><link rel="prefetch" href="/assets/js/page--b57aa070.43215f9e.js"><link rel="prefetch" href="/assets/js/page--ba329370.b5f22d13.js"><link rel="prefetch" href="/assets/js/page--bdd272b0.aff1d1a9.js"><link rel="prefetch" href="/assets/js/page--c28a65b0.978514c4.js"><link rel="prefetch" href="/assets/js/page--c606edca.49d3396e.js"><link rel="prefetch" href="/assets/js/page--c74258b0.f85195bc.js"><link rel="prefetch" href="/assets/js/page--cae237f0.8a976cc1.js"><link rel="prefetch" href="/assets/js/page--cf9a2af0.7ad20ea2.js"><link rel="prefetch" href="/assets/js/page--d4521df0.a0a74934.js"><link rel="prefetch" href="/assets/js/page--d7f1fd30.160f138a.js"><link rel="prefetch" href="/assets/js/page--dca9f030.9127ab28.js"><link rel="prefetch" href="/assets/js/page--e161e330.34876a6f.js"><link rel="prefetch" href="/assets/js/page--e4f35ef4.690d3ccb.js"><link rel="prefetch" href="/assets/js/page--e501c270.8dc088ee.js"><link rel="prefetch" href="/assets/js/page--e9b9b570.b94764ed.js"><link rel="prefetch" href="/assets/js/page--ea4e0a70.94492571.js"><link rel="prefetch" href="/assets/js/page--ee71a870.b9944792.js"><link rel="prefetch" href="/assets/js/page--f21187b0.d00a5788.js"><link rel="prefetch" href="/assets/js/page--f6c97ab0.ecb91d64.js"><link rel="prefetch" href="/assets/js/page--fb816db0.c1f07c37.js"><link rel="prefetch" href="/assets/js/page--fcf2f51e.71000d71.js"><link rel="prefetch" href="/assets/js/page--ff214cf0.aaa8b0fc.js"><link rel="prefetch" href="/assets/js/page-GN.2f20b55f.js"><link rel="prefetch" href="/assets/js/page-GNFrequentlyAskedQuestions.24e61c26.js"><link rel="prefetch" href="/assets/js/page-GNLanguageandOperation.35e22ff2.js"><link rel="prefetch" href="/assets/js/page-GNQuickStartguide.7cd8e521.js"><link rel="prefetch" href="/assets/js/page-GNReference.1d5d0c6c.js"><link rel="prefetch" href="/assets/js/page-GNSimpleBuildExample.2eb0b7eb.js"><link rel="prefetch" href="/assets/js/page-GNStyleGuide.8a407135.js"><link rel="prefetch" href="/assets/js/page-GNU汇编教程.d208e4d7.js"><link rel="prefetch" href="/assets/js/page-GNvimsyntaxplugin.58d1459e.js"><link rel="prefetch" href="/assets/js/page-GN快速入门.b708bb6a.js"><link rel="prefetch" href="/assets/js/page-Home.97282d71.js"><link rel="prefetch" href="/assets/js/page-HowGNhandlescross-compiling.6ca64957.js"><link rel="prefetch" href="/assets/js/page-Introduction.292088e0.js"><link rel="prefetch" href="/assets/js/page-ninja快速入门.92729e64.js"><link rel="prefetch" href="/assets/js/page-《孙子兵法》全文.402792c5.js"><link rel="prefetch" href="/assets/js/page-《论语》全文.85da0da0.js"><link rel="prefetch" href="/assets/js/page-《诗经》全文.99ebeb52.js"><link rel="prefetch" href="/assets/js/page-《道德经》全文.43627e4e.js"><link rel="prefetch" href="/assets/js/page-两个文档.eb8dd1b7.js"><link rel="prefetch" href="/assets/js/page-主流站点覆盖定期同步更新.1ad02178.js"><link rel="prefetch" href="/assets/js/page-手机版电脑版.b5e8dfea.js"><link rel="prefetch" href="/assets/js/page-捐助方式.6ca91d44.js"><link rel="prefetch" href="/assets/js/page-来源LiteOS和LiteOS-A内核图解.8fa16705.js"><link rel="prefetch" href="/assets/js/page-电脑版手机版.67a0b4a4.js"><link rel="prefetch" href="/assets/js/page-编程语言相关书籍.d9adf7cb.js"><link rel="prefetch" href="/assets/js/page-鸿蒙内核源码分析.bbb451c7.js"><link rel="prefetch" href="/assets/js/vendors~flowchart.46b2de48.js"><link rel="prefetch" href="/assets/js/vendors~mermaid.627fb4be.js"><link rel="prefetch" href="/assets/js/vendors~photo-swipe.cbde97f9.js"><link rel="prefetch" href="/assets/js/vendors~reveal.77b21b7e.js">
    <link rel="stylesheet" href="/assets/css/0.styles.087eb7d3.css">
  </head>
  <body>
    <div id="app" data-server-rendered="true"><div class="theme-container has-navbar has-sidebar has-anchor"><header class="navbar"><!----> <div class="content__navbar-start"></div> <button title="Sidebar Button" class="sidebar-button"><span class="icon"></span></button> <a href="/" class="home-link router-link-active"><!----> <!----> <span class="site-name can-hide">中俊为 | we harmonyos</span></a> <!----> <div class="content__navbar-center"></div> <div class="links"><button tabindex="-1" aria-hidden="true" class="color-button"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="skin-icon"><path d="M224 800c0 9.6 3.2 44.8 6.4 54.4 6.4 48-48 76.8-48 76.8s80 41.6 147.2 0 134.4-134.4
        38.4-195.2c-22.4-12.8-41.6-19.2-57.6-19.2C259.2 716.8 227.2 761.6 224 800zM560 675.2l-32
        51.2c-51.2 51.2-83.2 32-83.2 32 25.6 67.2 0 112-12.8 128 25.6 6.4 51.2 9.6 80 9.6 54.4 0
        102.4-9.6 150.4-32l0 0c3.2 0 3.2-3.2 3.2-3.2 22.4-16 12.8-35.2
        6.4-44.8-9.6-12.8-12.8-25.6-12.8-41.6 0-54.4 60.8-99.2 137.6-99.2 6.4 0 12.8 0 22.4
        0 12.8 0 38.4 9.6 48-25.6 0-3.2 0-3.2 3.2-6.4 0-3.2 3.2-6.4 3.2-6.4 6.4-16 6.4-16 6.4-19.2
        9.6-35.2 16-73.6 16-115.2 0-105.6-41.6-198.4-108.8-268.8C704 396.8 560 675.2 560 675.2zM224
        419.2c0-28.8 22.4-51.2 51.2-51.2 28.8 0 51.2 22.4 51.2 51.2 0 28.8-22.4 51.2-51.2 51.2C246.4
        470.4 224 448 224 419.2zM320 284.8c0-22.4 19.2-41.6 41.6-41.6 22.4 0 41.6 19.2 41.6 41.6 0
        22.4-19.2 41.6-41.6 41.6C339.2 326.4 320 307.2 320 284.8zM457.6 208c0-12.8 12.8-25.6 25.6-25.6
        12.8 0 25.6 12.8 25.6 25.6 0 12.8-12.8 25.6-25.6 25.6C470.4 233.6 457.6 220.8 457.6 208zM128
        505.6C128 592 153.6 672 201.6 736c28.8-60.8 112-60.8 124.8-60.8-16-51.2 16-99.2
        16-99.2l316.8-422.4c-48-19.2-99.2-32-150.4-32C297.6 118.4 128 291.2 128 505.6zM764.8
        86.4c-22.4 19.2-390.4 518.4-390.4 518.4-22.4 28.8-12.8 76.8 22.4 99.2l9.6 6.4c35.2 22.4
        80 12.8 99.2-25.6 0 0 6.4-12.8 9.6-19.2 54.4-105.6 275.2-524.8 288-553.6
        6.4-19.2-3.2-32-19.2-32C777.6 76.8 771.2 80 764.8 86.4z"></path></svg> <div class="color-picker-menu" style="display:none;"><div class="theme-options"><ul class="themecolor-select"><label for="themecolor-select">Theme Color:</label> <li><span class="default-theme"></span></li> </ul> <div class="darkmode-toggle"><label for="darkmode-toggle" class="desc">Theme Mode:</label> <div class="darkmode-switch"><div class="item day"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon light-icon"><path d="M512 256a42.667 42.667 0 0 0 42.667-42.667V128a42.667 42.667 0 0 0-85.334 0v85.333A42.667 42.667 0 0 0 512 256zm384 213.333h-85.333a42.667 42.667 0 0 0 0 85.334H896a42.667 42.667 0 0 0 0-85.334zM256 512a42.667 42.667 0 0 0-42.667-42.667H128a42.667 42.667 0 0 0 0 85.334h85.333A42.667 42.667 0 0 0 256 512zm9.387-298.667a42.667 42.667 0 0 0-59.307 62.72l61.44 59.307a42.667 42.667 0 0 0 31.147 11.947 42.667 42.667 0 0 0 30.72-13.227 42.667 42.667 0 0 0 0-60.16zm459.946 133.974a42.667 42.667 0 0 0 29.44-11.947l61.44-59.307a42.667 42.667 0 0 0-57.6-62.72l-61.44 60.587a42.667 42.667 0 0 0 0 60.16 42.667 42.667 0 0 0 28.16 13.227zM512 768a42.667 42.667 0 0 0-42.667 42.667V896a42.667 42.667 0 0 0 85.334 0v-85.333A42.667 42.667 0 0 0 512 768zm244.48-79.36a42.667 42.667 0 0 0-59.307 61.44l61.44 60.587a42.667 42.667 0 0 0 29.44 11.946 42.667 42.667 0 0 0 30.72-12.8 42.667 42.667 0 0 0 0-60.586zm-488.96 0-61.44 59.307a42.667 42.667 0 0 0 0 60.586 42.667 42.667 0 0 0 30.72 12.8 42.667 42.667 0 0 0 28.587-10.666l61.44-59.307a42.667 42.667 0 0 0-59.307-61.44zM512 341.333A170.667 170.667 0 1 0 682.667 512 170.667 170.667 0 0 0 512 341.333z" fill="currentColor"></path></svg></div> <div class="item auto active"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon auto-icon"><path d="M460.864 539.072H564.8L510.592 376l-49.728 163.072zM872 362.368V149.504H659.648L510.528 0l-149.12 149.504H149.12v212.928L0 511.872l149.12 149.504v212.928h212.352l149.12 149.504 149.12-149.504h212.352V661.376l149.12-149.504L872 362.368zM614.464 693.12l-31.616-90.624H438.272l-31.616 90.624h-85.888l144.576-407.68h90.368l144.576 407.68h-85.824zm0 0" fill="currentColor"></path></svg></div> <div class="item night"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon dark-icon"><path d="M935.539 630.402c-11.43-11.432-28.674-14.739-43.531-8.354-46.734 20.103-96.363 30.297-147.508 30.297-99.59 0-193.221-38.784-263.64-109.203-108.637-108.637-139.61-270.022-78.908-411.148a39.497 39.497 0 0 0-51.886-51.887c-52.637 22.64-100.017 54.81-140.826 95.616-85.346 85.346-132.346 198.821-132.346 319.52 0 120.7 47.001 234.172 132.347 319.519S408.063 947.11 528.76 947.11c120.7 0 234.172-47.003 319.52-132.351 40.809-40.81 72.978-88.19 95.616-140.826a39.497 39.497 0 0 0-8.356-43.532z" fill="currentColor"></path></svg></div></div> <!----></div></div></div></button> <div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/" class="nav-link router-link-active"><!---->
  首页
</a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="文档中心" class="dropdown-title"><span class="title"><!---->
        文档中心
      </span> <span class="arrow"></span></button> <ul class="nav-dropdown"><li class="dropdown-item"><a href="http://open.weharmonyos.com/zh-cn/readme/Readme-CN.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  子系统
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><a href="http://open.weharmonyos.com/zh-cn/device-dev/website.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  南向
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><a href="http://open.weharmonyos.com/zh-cn/application-dev/website.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  北向
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="博客中心" class="dropdown-title"><span class="title"><!---->
        博客中心
      </span> <span class="arrow"></span></button> <ul class="nav-dropdown"><li class="dropdown-item"><a href="/blog/101.html" class="nav-link"><!---->
  总目录
</a></li><li class="dropdown-item"><a href="/blog/index/1_base.html" class="nav-link"><!---->
  基础知识
</a></li><li class="dropdown-item"><a href="/blog/index/2_process.html" class="nav-link"><!---->
  进程管理
</a></li><li class="dropdown-item"><a href="/blog/index/3_task.html" class="nav-link"><!---->
  任务管理
</a></li><li class="dropdown-item"><a href="/blog/index/4_mem.html" class="nav-link"><!---->
  内存管理
</a></li><li class="dropdown-item"><a href="/blog/index/5_ipc.html" class="nav-link"><!---->
  进程通讯
</a></li><li class="dropdown-item"><a href="/blog/index/6_fs.html" class="nav-link"><!---->
  文件系统
</a></li><li class="dropdown-item"><a href="/blog/index/7_hw.html" class="nav-link"><!---->
  软硬接口
</a></li><li class="dropdown-item"><a href="/blog/index/8_asm.html" class="nav-link"><!---->
  内核汇编
</a></li><li class="dropdown-item"><a href="/blog/index/9_run.html" class="nav-link"><!---->
  编译运行
</a></li><li class="dropdown-item"><a href="/blog/index/10_test.html" class="nav-link"><!---->
  调测工具
</a></li><li class="dropdown-item"><a href="/blog/index/0_so.html" class="nav-link"><!---->
  前因后果
</a></li><li class="dropdown-item"><a href="/extsite.html" class="nav-link"><!---->
  前往 &gt;&gt; 外站
</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="论坛中心" class="dropdown-title"><span class="title"><!---->
        论坛中心
      </span> <span class="arrow"></span></button> <ul class="nav-dropdown"><li class="dropdown-item"><a href="http://bbs.weharmonyos.com" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  论坛首页
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><a href="http://bbs.weharmonyos.com/forum-42-1.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  问题建议
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="手册中心" class="dropdown-title"><span class="title"><!---->
        手册中心
      </span> <span class="arrow"></span></button> <ul class="nav-dropdown"><li class="dropdown-item"><a href="http://doxygen.weharmonyos.com/index.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  内核参考手册
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><a href="/compile/assembly.html" class="nav-link"><!---->
  gnu 汇编教程
</a></li><li class="dropdown-item"><a href="/compile/gn/docs/" class="nav-link"><!---->
  gn 参考手册
</a></li><li class="dropdown-item"><a href="/compile/ninja/Readme-CN.html" class="nav-link"><!---->
  ninja 参考手册
</a></li><li class="dropdown-item"><a href="/compile/fhs.html" class="nav-link"><!---->
  fhs 规范
</a></li></ul></div></div><div class="nav-item"><a href="/donate.html" class="nav-link"><!---->
  赞助中心
</a></div></nav> <!----> <!----> <!----> <div class="content__navbar-end"></div></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><!----> <!----> <div class="content__sidebar-top"></div> <nav class="sidebar-nav-links"><div class="nav-item"><a href="/" class="nav-link router-link-active"><!---->
  首页
</a></div><div class="nav-item"><div class="mobile-dropdown-wrapper"><button type="button" aria-label="文档中心" class="dropdown-title"><span class="title"><!---->
      文档中心
    </span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="http://open.weharmonyos.com/zh-cn/readme/Readme-CN.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  子系统
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="http://open.weharmonyos.com/zh-cn/device-dev/website.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  南向
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="http://open.weharmonyos.com/zh-cn/application-dev/website.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  北向
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li></ul></div></div><div class="nav-item"><div class="mobile-dropdown-wrapper"><button type="button" aria-label="博客中心" class="dropdown-title"><span class="title"><!---->
      博客中心
    </span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/blog/101.html" class="nav-link"><!---->
  总目录
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/1_base.html" class="nav-link"><!---->
  基础知识
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/2_process.html" class="nav-link"><!---->
  进程管理
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/3_task.html" class="nav-link"><!---->
  任务管理
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/4_mem.html" class="nav-link"><!---->
  内存管理
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/5_ipc.html" class="nav-link"><!---->
  进程通讯
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/6_fs.html" class="nav-link"><!---->
  文件系统
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/7_hw.html" class="nav-link"><!---->
  软硬接口
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/8_asm.html" class="nav-link"><!---->
  内核汇编
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/9_run.html" class="nav-link"><!---->
  编译运行
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/10_test.html" class="nav-link"><!---->
  调测工具
</a></li><li class="dropdown-item"><!----> <a href="/blog/index/0_so.html" class="nav-link"><!---->
  前因后果
</a></li><li class="dropdown-item"><!----> <a href="/extsite.html" class="nav-link"><!---->
  前往 &gt;&gt; 外站
</a></li></ul></div></div><div class="nav-item"><div class="mobile-dropdown-wrapper"><button type="button" aria-label="论坛中心" class="dropdown-title"><span class="title"><!---->
      论坛中心
    </span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="http://bbs.weharmonyos.com" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  论坛首页
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="http://bbs.weharmonyos.com/forum-42-1.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  问题建议
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li></ul></div></div><div class="nav-item"><div class="mobile-dropdown-wrapper"><button type="button" aria-label="手册中心" class="dropdown-title"><span class="title"><!---->
      手册中心
    </span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="http://doxygen.weharmonyos.com/index.html" target="_blank" rel="noopener noreferrer" class="nav-link external"><!---->
  内核参考手册
  <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></li><li class="dropdown-item"><!----> <a href="/compile/assembly.html" class="nav-link"><!---->
  gnu 汇编教程
</a></li><li class="dropdown-item"><!----> <a href="/compile/gn/docs/" class="nav-link"><!---->
  gn 参考手册
</a></li><li class="dropdown-item"><!----> <a href="/compile/ninja/Readme-CN.html" class="nav-link"><!---->
  ninja 参考手册
</a></li><li class="dropdown-item"><!----> <a href="/compile/fhs.html" class="nav-link"><!---->
  fhs 规范
</a></li></ul></div></div><div class="nav-item"><a href="/donate.html" class="nav-link"><!---->
  赞助中心
</a></div> <!----></nav> <!----> <div class="content__sidebar-center"></div> <ul class="sidebar-links"><li><a href="/blog/101.html" class="sidebar-link">总目录</a></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">基础知识 | 10</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">进程管理 | 10</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">任务管理 | 10</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">内存管理 | 10</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable open"><!----> <span class="title">通讯机制 | 14</span> <span class="arrow down"></span></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/blog/index/5_ipc.html" class="sidebar-link">本章目录</a></li><li><a href="/blog/41.html" class="sidebar-link">通讯总览</a></li><li><a href="/blog/42.html" class="sidebar-link">自旋锁</a></li><li><a href="/blog/43.html" class="sidebar-link">互斥锁</a></li><li><a href="/blog/44.html" class="sidebar-link">快锁使用</a></li><li><a href="/blog/45.html" class="sidebar-link">快锁实现</a></li><li><a href="/blog/46.html" class="sidebar-link">读写锁</a></li><li><a href="/blog/47.html" class="sidebar-link">信号量</a></li><li><a href="/blog/48.html" class="sidebar-link">事件机制</a></li><li><a href="/blog/49.html" aria-current="page" class="active sidebar-link">信号生产</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/blog/50.html" class="sidebar-link">信号消费</a></li><li><a href="/blog/51.html" class="sidebar-link">消息队列</a></li><li><a href="/blog/52.html" class="sidebar-link">消息封装</a></li><li><a href="/blog/53.html" class="sidebar-link">消息映射</a></li><li><a href="/blog/54.html" class="sidebar-link">共享内存</a></li></ul></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">文件系统 | 10</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">硬件架构 | 9</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">内核汇编 | 10</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">编译运行 | 13</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">调测工具 | 4</span> <span class="arrow right"></span></p> <!----></section></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading clickable"><!----> <span class="title">前因后果 | 4</span> <span class="arrow right"></span></p> <!----></section></li></ul> <!----> <div class="content__sidebar-bottom"></div> <!----></aside> <main class="page"><nav class="breadcrumb disable"><!----></nav> <!----> <div class="content__page-top"></div> <div vocab="https://schema.org/" typeof="Article" class="page-title"><h1><!----> <span property="headline"></span></h1> <div class="page-info"><!----> </div> <!----> <hr></div> <div class="anchor-place-holder"><aside id="anchor"><div class="anchor-wrapper"><ul class="anchor-list"><li class="anchor"><a href="/blog/49.html#信号生产" class="anchor-link heading3"><div>信号生产</div></a></li><li class="anchor"><a href="/blog/49.html#信号分类" class="anchor-link heading3"><div>信号分类</div></a></li><li class="anchor"><a href="/blog/49.html#信号来源" class="anchor-link heading3"><div>信号来源</div></a></li><li class="anchor"><a href="/blog/49.html#信号与进程的关系" class="anchor-link heading3"><div>信号与进程的关系</div></a></li><li class="anchor"><a href="/blog/49.html#信号与任务的关系" class="anchor-link heading3"><div>信号与任务的关系</div></a></li><li class="anchor"><a href="/blog/49.html#信号发送过程" class="anchor-link heading3"><div>信号发送过程</div></a></li><li class="anchor"><a href="/blog/49.html#代码细节" class="anchor-link heading3"><div>代码细节</div></a></li><li class="anchor"><a href="/blog/49.html#信号相关函数" class="anchor-link heading3"><div>信号相关函数</div></a></li><li class="anchor"><a href="/blog/49.html#百文说内核-抓住主脉络" class="anchor-link heading3"><div>百文说内核 | 抓住主脉络</div></a></li><li class="anchor"><a href="/blog/49.html#百万注源码-处处扣细节" class="anchor-link heading3"><div>百万注源码 | 处处扣细节</div></a></li><li class="anchor"><a href="/blog/49.html#关注不迷路-代码即人生" class="anchor-link heading3"><div>关注不迷路 | 代码即人生</div></a></li></ul></div></aside></div> <!----> <div class="content__content-top"></div> <div class="theme-default-content content__default"><p>本篇关键词：、、、</p> <p><a href="https://weharmony.gitee.io/blog/49.html" target="_blank" rel="noopener noreferrer"><img src="https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/index/49.png" alt=""></a></p> <p><a href="https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/pdf/%E9%B8%BF%E8%92%99%E5%86%85%E6%A0%B8%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90(%E7%99%BE%E7%AF%87%E5%8D%9A%E5%AE%A2%E5%88%86%E6%9E%90.%E6%8C%96%E9%80%8F%E9%B8%BF%E8%92%99%E5%86%85%E6%A0%B8).zip" target="_blank" rel="noopener noreferrer">下载 &gt;&gt; 离线文档.鸿蒙内核源码分析(百篇博客分析.挖透鸿蒙内核).pdf</a></p> <p>通讯机制相关篇为:</p> <ul><li><a href="http://weharmonyos.com/blog/41.html" target="_blank" rel="noopener noreferrer">v41.04 鸿蒙内核源码分析(通讯总览) | 内核跟人一样都喜欢八卦</a></li> <li><a href="http://weharmonyos.com/blog/42.html" target="_blank" rel="noopener noreferrer">v42.08 鸿蒙内核源码分析(自旋锁) | 死等丈夫归来的贞洁烈女</a></li> <li><a href="http://weharmonyos.com/blog/43.html" target="_blank" rel="noopener noreferrer">v43.05 鸿蒙内核源码分析(互斥锁) | 有你没她 相安无事</a></li> <li><a href="http://weharmonyos.com/blog/44.html" target="_blank" rel="noopener noreferrer">v44.02 鸿蒙内核源码分析(快锁使用) | 用户态负责快锁逻辑</a></li> <li><a href="http://weharmonyos.com/blog/45.html" target="_blank" rel="noopener noreferrer">v45.02 鸿蒙内核源码分析(快锁实现) | 内核态负责快锁调度</a></li> <li><a href="http://weharmonyos.com/blog/46.html" target="_blank" rel="noopener noreferrer">v46.01 鸿蒙内核源码分析(读写锁) | 内核如何实现多读单写</a></li> <li><a href="http://weharmonyos.com/blog/47.html" target="_blank" rel="noopener noreferrer">v47.05 鸿蒙内核源码分析(信号量) | 谁在解决任务间的同步</a></li> <li><a href="http://weharmonyos.com/blog/48.html" target="_blank" rel="noopener noreferrer">v48.07 鸿蒙内核源码分析(事件机制) | 多对多任务如何同步</a></li> <li><a href="http://weharmonyos.com/blog/49.html" target="_blank" rel="noopener noreferrer">v49.05 鸿蒙内核源码分析(信号生产) | 年过半百 活力十足</a></li> <li><a href="http://weharmonyos.com/blog/50.html" target="_blank" rel="noopener noreferrer">v50.03 鸿蒙内核源码分析(信号消费) | 谁让CPU连续四次换栈运行</a></li> <li><a href="http://weharmonyos.com/blog/51.html" target="_blank" rel="noopener noreferrer">v51.03 鸿蒙内核源码分析(消息队列) | 进程间如何异步传递大数据</a></li> <li><a href="http://weharmonyos.com/blog/52.html" target="_blank" rel="noopener noreferrer">v52.02 鸿蒙内核源码分析(消息封装) | 剖析LiteIpc(上)进程通讯内容</a></li> <li><a href="http://weharmonyos.com/blog/53.html" target="_blank" rel="noopener noreferrer">v53.01 鸿蒙内核源码分析(消息映射) | 剖析LiteIpc(下)进程通讯机制</a></li> <li><a href="http://weharmonyos.com/blog/54.html" target="_blank" rel="noopener noreferrer">v54.01 鸿蒙内核源码分析(共享内存) | 进程间最快通讯方式</a></li></ul> <h3 id="信号生产">信号生产</h3> <p>关于信号篇，本只想写一篇，但发现把它想简单了，内容不多，难度极大。整理了好长时间，理解了为何&lt;&lt;深入理解linux内核&gt;&gt;要单独为它开一章，原因有二</p> <ul><li>信号相关的结构体多，而且还容易搞混。所以看本篇要注意结构体的名字和作用。</li> <li>系统调用太多了，涉及面广，信号的来源分硬件和软件。相当于软中断和硬中断，这就会涉及到汇编代码，但信号的处理函数又在用户空间，CPU是禁止内核态执行用户态代码的，所以运行过程需在用户空间和内核空间来回的折腾，频繁的切换上下文。</li></ul> <p>信号思想来自Unix，它老人家已经五十多岁了，但很有活力，许多方面几乎没发生大的变化。信号可以由内核产生，也可以由用户进程产生，并由内核传送给特定的进程或线程(组)，若这个进程定义了自己的信号处理程序，则调用这个程序去处理信号，否则则执行默认的程序或者忽略。</p> <p>信号为系统提供了一种进程间异步通讯的方式，一个进程不必通过任何操作来等待信号的到达。事实上，进程也不可能知道信号到底什么时候到达。一般来说，只需用户进程提供信号处理函数，内核会想方设法调用信号处理函数，网上查阅了很多的关于信号的资料。个人想换个视角去看信号。把异步过程理解为生产者(安装和发送信号)和消费者(捕捉和处理信号)两个过程。鉴于此，系列篇将分成两篇说明，本篇为信号生产篇:</p> <ul><li><strong>v49.xx (信号生产篇) | 年过半百，依然活力十足</strong></li> <li><strong>v50.xx (信号消费篇) | 谁让CPU连续四次换栈运行</strong></li></ul> <h3 id="信号分类">信号分类</h3> <p>每个信号都有一个名字和编号，这些名字都以<code>SIG</code>开头，例如<code>SIGQUIT</code>、<code>SIGCHLD</code>等等。
信号定义在signal。h头文件中，信号名都定义为正整数。
具体的信号名称可以使用<code>kill -l</code>来查看信号的名字以及序号，信号是从1开始编号的，不存在0号信号。不过<code>kill</code>对于信号0有特殊的应用。啥用呢？ 可用来查询进程是否还在。 敲下 <code>kill 0 pid</code> 就知道了。</p> <p>信号分为两大类：可靠信号与不可靠信号，前32种信号为不可靠信号，后32种为可靠信号。</p> <ul><li><p>不可靠信号： 也称为非实时信号，不支持排队，信号可能会丢失， 比如发送多次相同的信号， 进程只能收到一次。 信号值取值区间为1~31；</p></li> <li><p>可靠信号： 也称为实时信号，支持排队， 信号不会丢失， 发多少次， 就可以收到多少次。 信号值取值区间为32~64</p></li></ul> <div class="language- line-numbers-mode"><pre class="language-text"><code>  #define SIGHUP    1	//终端挂起或者控制进程终止
  #define SIGINT    2	//键盘中断（ctrl + c）
  #define SIGQUIT   3	//键盘的退出键被按下
  #define SIGILL    4	//非法指令
  #define SIGTRAP   5	//跟踪陷阱（trace trap），启动进程，跟踪代码的执行
  #define SIGABRT   6	//由abort(3)发出的退出指令
  #define SIGIOT    SIGABRT //abort发出的信号
  #define SIGBUS    7	//总线错误 
  #define SIGFPE    8	//浮点异常
  #define SIGKILL   9	//常用的命令 kill 9 123 | 不能被忽略、处理和阻塞
  #define SIGUSR1   10	//用户自定义信号1 
  #define SIGSEGV   11	//无效的内存引用， 段违例（segmentation     violation），进程试图去访问其虚地址空间以外的位置 
  #define SIGUSR2   12	//用户自定义信号2
  #define SIGPIPE   13	//向某个非读管道中写入数据 
  #define SIGALRM   14	//由alarm(2)发出的信号，默认行为为进程终止
  #define SIGTERM   15	//终止信号
  #define SIGSTKFLT 16	//栈溢出
  #define SIGCHLD   17	//子进程结束信号
  #define SIGCONT   18	//进程继续（曾被停止的进程）
  #define SIGSTOP   19	//终止进程  	 | 不能被忽略、处理和阻塞
  #define SIGTSTP   20	//控制终端（tty）上 按下停止键
  #define SIGTTIN   21	//进程停止，后台进程企图从控制终端读
  #define SIGTTOU   22	//进程停止，后台进程企图从控制终端写
  #define SIGURG    23	//I/O有紧急数据到达当前进程
  #define SIGXCPU   24	//进程的CPU时间片到期
  #define SIGXFSZ   25	//文件大小的超出上限
  #define SIGVTALRM 26	//虚拟时钟超时
  #define SIGPROF   27	//profile时钟超时
  #define SIGWINCH  28	//窗口大小改变
  #define SIGIO     29	//I/O相关
  #define SIGPOLL   29	//
  #define SIGPWR    30	//电源故障，关机
  #define SIGSYS    31	//系统调用中参数错，如系统调用号非法 
  #define SIGUNUSED SIGSYS//不使用

  #define _NSIG 65
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br></div></div><h3 id="信号来源">信号来源</h3> <p>信号来源分为硬件类和软件类：</p> <ul><li>硬件类
<ul><li>用户输入：比如在终端上按下组合键<code>ctrl+C</code>，产生<code>SIGINT</code>信号；</li> <li>硬件异常：CPU检测到内存非法访问等异常，通知内核生成相应信号，并发送给发生事件的进程；</li></ul></li> <li>软件类
<ul><li>通过系统调用，发送signal信号：<code>kill()</code>，<code>raise()</code>，<code>sigqueue()</code>，<code>alarm()</code>，<code>setitimer()</code>，<code>abort()</code> <ul><li><code>kill</code> 命令就是一个发送信号的工具，用于向进程或进程组发送信号。例如: <code>kill 9 PID</code> (<code>SIGKILL</code>)来杀死<code>PID</code>进程。</li> <li>sigqueue()：只能向一个进程发送信号，不能向进程组发送信号；主要针对实时信号提出，与sigaction()组合使用，当然也支持非实时信号的发送；</li> <li>alarm()：用于调用进程指定时间后发出SIGALARM信号；</li> <li>setitimer()：设置定时器，计时达到后给进程发送SIGALRM信号，功能比alarm更强大；</li> <li>abort()：向进程发送SIGABORT信号，默认进程会异常退出。</li> <li>raise()：用于向进程自身发送信号；</li></ul></li></ul></li></ul> <h3 id="信号与进程的关系">信号与进程的关系</h3> <p>主要是通过系统调用 <code>sigaction</code>将用户态信号处理函数注册到PCB保存。所有进程的任务都共用这个信号注册函数<code>sigHandler</code>，在信号的消费阶段内核用一种特殊的方式'回调'它。</p> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token keyword">typedef</span> <span class="token keyword">struct</span> <span class="token class-name">ProcessCB</span> <span class="token punctuation">{</span><span class="token comment">//PCB中关于信号的信息</span>
    UINTPTR              sigHandler<span class="token punctuation">;</span>   <span class="token comment">/**&lt; signal handler */</span>   <span class="token comment">//捕捉信号后的处理函数</span>
    <span class="token class-name">sigset_t</span>             sigShare<span class="token punctuation">;</span>     <span class="token comment">/**&lt; signal share bit */</span>	<span class="token comment">//信号共享位，64个信号各站一位</span>
<span class="token punctuation">}</span>LosProcessCB<span class="token punctuation">;</span>
<span class="token keyword">typedef</span> <span class="token keyword">unsigned</span> _Int64 <span class="token class-name">sigset_t</span><span class="token punctuation">;</span> <span class="token comment">//一个64位的变量，每个信号代表一位。</span>
<span class="token keyword">struct</span> <span class="token class-name">sigaction</span> <span class="token punctuation">{</span><span class="token comment">//信号处理机制结构体</span>
	<span class="token keyword">union</span> <span class="token punctuation">{</span>
		<span class="token keyword">void</span> <span class="token punctuation">(</span><span class="token operator">*</span>sa_handler<span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//信号处理函数——普通版</span>
		<span class="token keyword">void</span> <span class="token punctuation">(</span><span class="token operator">*</span>sa_sigaction<span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token keyword">int</span>， <span class="token class-name">siginfo_t</span> <span class="token operator">*</span>， <span class="token keyword">void</span> <span class="token operator">*</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//信号处理函数——高级版</span>
	<span class="token punctuation">}</span> __sa_handler<span class="token punctuation">;</span>
	<span class="token class-name">sigset_t</span> sa_mask<span class="token punctuation">;</span><span class="token comment">//指定信号处理程序执行过程中需要阻塞的信号；</span>
	<span class="token keyword">int</span> sa_flags<span class="token punctuation">;</span>	 <span class="token comment">//标示位</span>
					 <span class="token comment">//	SA_RESTART：使被信号打断的syscall重新发起。</span>
					 <span class="token comment">//	SA_NOCLDSTOP：使父进程在它的子进程暂停或继续运行时不会收到 SIGCHLD 信号。</span>
					 <span class="token comment">//	SA_NOCLDWAIT：使父进程在它的子进程退出时不会收到SIGCHLD信号，这时子进程如果退出也不会成为僵 尸进程。</span>
					 <span class="token comment">//	SA_NODEFER：使对信号的屏蔽无效，即在信号处理函数执行期间仍能发出这个信号。</span>
					 <span class="token comment">//	SA_RESETHAND：信号处理之后重新设置为默认的处理方式。</span>
					 <span class="token comment">//	SA_SIGINFO：使用sa_sigaction成员而不是sa_handler作为信号处理函数。</span>
	<span class="token keyword">void</span> <span class="token punctuation">(</span><span class="token operator">*</span>sa_restorer<span class="token punctuation">)</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token keyword">typedef</span> <span class="token keyword">struct</span> <span class="token class-name">sigaction</span> <span class="token class-name">sigaction_t</span><span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br></div></div><p><strong>解读</strong></p> <ul><li><p>每个信号都对应一个位。 信号从1开始编号 [1 ~ 64] 对应 <code>sigShare</code>的[0 ~ 63]位，所以中间会差一个。记住这点，后续代码会提到。</p></li> <li><p><code>sigHandler</code>信号处理函数的注册过程，由系统调用<code>sigaction</code>(用户空间) -&gt; <code>OsSigAction</code>(内核空间)完成绑定动作。</p> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;signal.h&gt;</span></span>
<span class="token keyword">int</span> <span class="token function">sigaction</span><span class="token punctuation">(</span><span class="token keyword">int</span> signo， <span class="token keyword">const</span> <span class="token keyword">struct</span> <span class="token class-name">sigaction</span> <span class="token operator">*</span>act， <span class="token keyword">struct</span> <span class="token class-name">sigaction</span> <span class="token operator">*</span>oact<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> <span class="token function">OsSigAction</span><span class="token punctuation">(</span><span class="token keyword">int</span> sig， <span class="token keyword">const</span> <span class="token class-name">sigaction_t</span> <span class="token operator">*</span>act， <span class="token class-name">sigaction_t</span> <span class="token operator">*</span>oact<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    UINTPTR addr<span class="token punctuation">;</span>
    <span class="token class-name">sigaction_t</span> action<span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">GOOD_SIGNO</span><span class="token punctuation">(</span>sig<span class="token punctuation">)</span> <span class="token operator">||</span> sig <span class="token operator">&lt;</span> <span class="token number">1</span> <span class="token operator">||</span> act <span class="token operator">==</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">return</span> <span class="token operator">-</span>EINVAL<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">//将数据从用户空间拷贝到内核空间</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">LOS_ArchCopyFromUser</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>action， act， <span class="token keyword">sizeof</span><span class="token punctuation">(</span><span class="token class-name">sigaction_t</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">!=</span> LOS_OK<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">return</span> <span class="token operator">-</span>EFAULT<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>sig <span class="token operator">==</span> SIGSYS<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//鸿蒙此处通过错误的系统调用 来安装信号处理函数，有点巧妙。 </span>
        addr <span class="token operator">=</span> <span class="token function">OsGetSigHandler</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//获取进程信号处理函数</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>addr <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//进程没有设置信号处理函数时</span>
            <span class="token function">OsSetSigHandler</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token keyword">unsigned</span> <span class="token keyword">long</span><span class="token punctuation">)</span><span class="token punctuation">(</span>UINTPTR<span class="token punctuation">)</span>action<span class="token punctuation">.</span>sa_handler<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//设置进程信号处理函数——普通版</span>
            <span class="token keyword">return</span> LOS_OK<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">return</span> <span class="token operator">-</span>EINVAL<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">return</span> LOS_OK<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br></div></div><ul><li><code>sigaction(...)</code>第一个参数是要安装的信号; 第二个参数与sigaction函数同名的结构体，这里会让人很懵，函数名和结构体一直，没明白为毛要这么搞？ 结构体内定义了信号处理方法;第三个为输出参数，将信号的当前的sigaction结构带回。但鸿蒙显然没有认真对待第三个参数。把<code>musl</code>实现给阉割了。</li> <li>对结构体的<code>sigaction</code>鸿蒙目前只支持信号处理函数——普通版，<code>sa_handler</code>表示自定义信号处理函数，该函数返回值为void，可以带一个int参数，通过参数可以得知当前信号的编号，这样就可以用同一个函数处理多种信号。</li> <li><code>sa_mask</code>指定信号处理程序执行过程中需要阻塞的信号。</li> <li><code>sa_flags</code>字段包含一些选项，具体看注释</li> <li><code>sa_sigaction</code>是实时信号的处理函数，<code>union</code>二选一。鸿蒙暂时不支持这种方式。</li></ul></li></ul> <h3 id="信号与任务的关系">信号与任务的关系</h3> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token keyword">typedef</span> <span class="token keyword">struct</span> <span class="token punctuation">{</span><span class="token comment">//TCB中关于信号的信息</span>
    sig_cb          sig<span class="token punctuation">;</span>	<span class="token comment">//信号控制块，用于异步通信，类似于 linux singal模块</span>
<span class="token punctuation">}</span> LosTaskCB<span class="token punctuation">;</span>
<span class="token keyword">typedef</span> <span class="token keyword">struct</span> <span class="token punctuation">{</span><span class="token comment">//信号控制块(描述符)</span>
    <span class="token class-name">sigset_t</span> sigFlag<span class="token punctuation">;</span>		<span class="token comment">//不屏蔽的信号标签集</span>
    <span class="token class-name">sigset_t</span> sigPendFlag<span class="token punctuation">;</span>	<span class="token comment">//信号阻塞标签集，记录因哪些信号被阻塞</span>
    <span class="token class-name">sigset_t</span> sigprocmask<span class="token punctuation">;</span> <span class="token comment">/* Signals that are blocked            */</span>	<span class="token comment">//进程屏蔽了哪些信号</span>
    <span class="token class-name">sq_queue_t</span> sigactionq<span class="token punctuation">;</span>	<span class="token comment">//信号捕捉队列					</span>
    LOS_DL_LIST waitList<span class="token punctuation">;</span>	<span class="token comment">//等待链表，上面挂的是等待信号到来的任务， 可查找 OsTaskWait(&amp;sigcb-&gt;waitList， timeout， TRUE)	理解						</span>
    <span class="token class-name">sigset_t</span> sigwaitmask<span class="token punctuation">;</span> <span class="token comment">/* Waiting for pending signals         */</span>	<span class="token comment">//任务在等待阻塞信号</span>
    <span class="token class-name">siginfo_t</span> sigunbinfo<span class="token punctuation">;</span> <span class="token comment">/* Signal info when task unblocked     */</span>	<span class="token comment">//任务解锁时的信号信息</span>
    sig_switch_context context<span class="token punctuation">;</span>	<span class="token comment">//信号切换上下文， 用于保存切换现场， 比如发生系统调用时的返回，涉及同一个任务的两个栈进行切换							</span>
<span class="token punctuation">}</span> sig_cb<span class="token punctuation">;</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br></div></div><p><strong>解读</strong></p> <ul><li>系列篇已多次说过，进程只是管理资源的容器，真正让cpu干活的是任务<code>task</code>，所以发给进程的信号最终还是需要分发给具体任务来处理。所以能想到的是关于任务部分会更复杂。</li> <li><code>context</code>信号处理很复杂的原因在于信号的发起在用户空间，发送需要系统调用，而处理信号的函数又是用户空间提供的， 所以需要反复的切换任务上下文。而且还有硬中断的问题，比如 ctrl + c ，需要从硬中断中回调用户空间的信号处理函数，处理完了再回到内核空间，最后回到用户空间。没听懂吧，我自己都说晕了，所以需要专门的一篇来说清楚信号的处理问题。本篇不展开说。</li> <li><code>sig_cb</code>结构体是任务处理信号的结构体，要响应，屏蔽哪些信号等等都由它完成，这个结构体虽不复杂，但是很绕，很难搞清楚它们之间的区别。笔者是经过一番痛苦的阅读理解后才明白各自的含义。并想通过用打比方的例子试图让大家明白。</li> <li>以下用追女孩打比方理解。任务相当于某个男，没错说的就是屏幕前的你，除了苦逼的码农谁会有耐心能坚持看到这里。64个信号对应64个女孩。允许一男同时追多个女孩，女孩也可同时被多个男追。女孩也可以主动追男的。理解如下:</li> <li><code>waitList</code>等待信号的任务链表，上面挂的是因等待信号而被阻塞的任务。众男在排队追各自心爱的女孩们，处于无所事事的挂起的状态，等待女孩们的出现。</li> <li><code>sigwaitmask</code>任务在等待的信号集合，只有这些信号能唤醒任务。相当于列出喜欢的各位女孩，只要出现一位就能让你满血复活。</li> <li><code>sigprocmask</code>指任务对哪些信号不感冒。来了也不处理。相当于列出不喜欢的各位女孩，请她们别来骚扰你，嘚瑟。</li> <li><code>sigPendFlag</code>信号到达但并未唤醒任务。相当于喜欢你的女孩来追你，但她不在你喜欢的列表内，结果是不搭理人家继续等喜欢的出现。</li> <li><code>sigFlag</code>记录不屏蔽的信号集合，相当于你并不反感的女孩们。记录来过的那些女孩(除掉你不喜欢的)。</li></ul> <h3 id="信号发送过程">信号发送过程</h3> <p>用户进程调用<code>kill()</code>的过程如下:</p> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token function">kill</span><span class="token punctuation">(</span><span class="token class-name">pid_t</span> pid， <span class="token keyword">int</span> sig<span class="token punctuation">)</span> <span class="token operator">-</span> 系统调用   
<span class="token operator">|</span>                    用户空间
<span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">--</span><span class="token operator">-</span>
<span class="token operator">|</span>                    内核空间
<span class="token function">SysKill</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span>
<span class="token operator">|</span><span class="token operator">--</span><span class="token operator">-&gt;</span> <span class="token function">OsKillLock</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span>
    <span class="token operator">|</span><span class="token operator">--</span><span class="token operator">-&gt;</span> <span class="token function">OsKill</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span>， OS_USER_KILL_PERMISSION<span class="token punctuation">)</span>
        <span class="token operator">|</span><span class="token operator">--</span><span class="token operator">-&gt;</span> <span class="token function">OsDispatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span>  <span class="token comment">//鉴权，向进程发送信号</span>
            <span class="token operator">|</span><span class="token operator">--</span><span class="token operator">-&gt;</span> <span class="token function">OsSigProcessSend</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token comment">//选择任务发送信号</span>
                <span class="token operator">|</span><span class="token operator">--</span><span class="token operator">-&gt;</span> <span class="token function">OsSigProcessForeachChild</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span>，ForEachTaskCB handler，<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span>
                    <span class="token operator">|</span><span class="token operator">--</span><span class="token operator">-&gt;</span> <span class="token function">SigProcessKillSigHandler</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">//处理 SIGKILL</span>
                        <span class="token operator">|</span><span class="token operator">--</span><span class="token operator">-&gt;</span> <span class="token function">OsTaskWake</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">//唤醒所有等待任务</span>
                        <span class="token operator">|</span><span class="token operator">--</span><span class="token operator">-&gt;</span> <span class="token function">OsSigEmptySet</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">//清空信号等待集</span>
                    <span class="token operator">|</span><span class="token operator">--</span><span class="token operator">-&gt;</span> <span class="token function">SigProcessSignalHandler</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
                        <span class="token operator">|</span><span class="token operator">--</span><span class="token operator">-&gt;</span> <span class="token function">OsTcbDispatch</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">//向目标任务发送信号</span>
                            <span class="token operator">|</span><span class="token operator">--</span><span class="token operator">-&gt;</span> <span class="token function">OsTaskWake</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">//唤醒任务</span>
                            <span class="token operator">|</span><span class="token operator">--</span><span class="token operator">-&gt;</span> <span class="token function">OsSigEmptySet</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">//清空信号等待集</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br></div></div><p><strong>流程</strong></p> <ul><li><p>通过 系统调用 <code>kill</code> 陷入内核空间</p></li> <li><p>因为是用户态进程，使用<code>OS_USER_KILL_PERMISSION</code>权限发送信号</p> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">OS_KERNEL_KILL_PERMISSION</span> <span class="token expression"><span class="token number">0U</span>	</span><span class="token comment">//内核态 kill 权限</span></span>
<span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">OS_USER_KILL_PERMISSION</span>   <span class="token expression"><span class="token number">3U</span>	</span><span class="token comment">//用户态 kill 权限</span></span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div></li> <li><p>鉴权之后进程轮询任务组，向目标任务发送信号。这里分三种情况:</p> <ul><li><code>SIGKILL</code>信号，将所有等待任务唤醒，拉入就绪队列等待被调度执行，并情况信号等待集</li> <li>非<code>SIGKILL</code>信号时，将通过<code>sigwaitmask</code>和<code>sigprocmask</code>过滤，找到一个任务向它发送信号<code>OsTcbDispatch</code>。</li></ul></li></ul> <h3 id="代码细节">代码细节</h3> <div class="language-c line-numbers-mode"><pre class="language-c"><code>    <span class="token keyword">int</span> <span class="token function">OsKill</span><span class="token punctuation">(</span><span class="token class-name">pid_t</span> pid， <span class="token keyword">int</span> sig， <span class="token keyword">int</span> permission<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token class-name">siginfo_t</span> info<span class="token punctuation">;</span>
        <span class="token keyword">int</span> ret<span class="token punctuation">;</span>
        <span class="token comment">/* Make sure that the para is valid */</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">GOOD_SIGNO</span><span class="token punctuation">(</span>sig<span class="token punctuation">)</span> <span class="token operator">||</span> pid <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//有效信号 [0，64]</span>
            <span class="token keyword">return</span> <span class="token operator">-</span>EINVAL<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">OsProcessIDUserCheckInvalid</span><span class="token punctuation">(</span>pid<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//检查参数进程 </span>
            <span class="token keyword">return</span> <span class="token operator">-</span>ESRCH<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token comment">/* Create the siginfo structure */</span> <span class="token comment">//创建信号结构体</span>
        info<span class="token punctuation">.</span>si_signo <span class="token operator">=</span> sig<span class="token punctuation">;</span>	<span class="token comment">//信号编号</span>
        info<span class="token punctuation">.</span>si_code <span class="token operator">=</span> SI_USER<span class="token punctuation">;</span>	<span class="token comment">//来自用户进程信号</span>
        info<span class="token punctuation">.</span>si_value<span class="token punctuation">.</span>sival_ptr <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
        <span class="token comment">/* Send the signal */</span>
        ret <span class="token operator">=</span> <span class="token function">OsDispatch</span><span class="token punctuation">(</span>pid， <span class="token operator">&amp;</span>info， permission<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//发送信号</span>
        <span class="token keyword">return</span> ret<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">//信号分发</span>
    <span class="token keyword">int</span> <span class="token function">OsDispatch</span><span class="token punctuation">(</span><span class="token class-name">pid_t</span> pid， <span class="token class-name">siginfo_t</span> <span class="token operator">*</span>info， <span class="token keyword">int</span> permission<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        LosProcessCB <span class="token operator">*</span>spcb <span class="token operator">=</span> <span class="token function">OS_PCB_FROM_PID</span><span class="token punctuation">(</span>pid<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//找到这个进程</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">OsProcessIsUnused</span><span class="token punctuation">(</span>spcb<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//进程是否还在使用，不一定是当前进程但必须是个有效进程</span>
            <span class="token keyword">return</span> <span class="token operator">-</span>ESRCH<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
    <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">ifdef</span> <span class="token expression">LOSCFG_SECURITY_CAPABILITY	</span><span class="token comment">//启用能力安全模式</span></span>
        LosProcessCB <span class="token operator">*</span>current <span class="token operator">=</span> <span class="token function">OsCurrProcessGet</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//获取当前进程</span>
        <span class="token comment">/* If the process you want to kill had been inactive， but still exist. should return LOS_OK */</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">OsProcessIsInactive</span><span class="token punctuation">(</span>spcb<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//如果要终止的进程处于非活动状态，但仍然存在，应该返回OK</span>
            <span class="token keyword">return</span> LOS_OK<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token comment">/* Kernel process always has kill permission and user process should check permission */</span><span class="token comment">//内核进程总是有kill权限，用户进程需要检查权限</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">OsProcessIsUserMode</span><span class="token punctuation">(</span>current<span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token operator">!</span><span class="token punctuation">(</span>current<span class="token operator">-&gt;</span>processStatus <span class="token operator">&amp;</span> OS_PROCESS_FLAG_EXIT<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//用户进程检查能力范围</span>
            <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>current <span class="token operator">!=</span> spcb<span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">IsCapPermit</span><span class="token punctuation">(</span>CAP_KILL<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token punctuation">(</span>current<span class="token operator">-&gt;</span>user<span class="token operator">-&gt;</span>userID <span class="token operator">!=</span> spcb<span class="token operator">-&gt;</span>user<span class="token operator">-&gt;</span>userID<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
                <span class="token keyword">return</span> <span class="token operator">-</span>EPERM<span class="token punctuation">;</span>
            <span class="token punctuation">}</span>
        <span class="token punctuation">}</span>
    <span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>permission <span class="token operator">==</span> OS_USER_KILL_PERMISSION<span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token punctuation">(</span><span class="token function">OsSignalPermissionToCheck</span><span class="token punctuation">(</span>spcb<span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            <span class="token keyword">return</span> <span class="token operator">-</span>EPERM<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">return</span> <span class="token function">OsSigProcessSend</span><span class="token punctuation">(</span>spcb， info<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//给参数进程发送信号</span>
    <span class="token punctuation">}</span>
    <span class="token comment">//给参数进程发送参数信号</span>
    <span class="token keyword">int</span> <span class="token function">OsSigProcessSend</span><span class="token punctuation">(</span>LosProcessCB <span class="token operator">*</span>spcb， <span class="token class-name">siginfo_t</span> <span class="token operator">*</span>sigInfo<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">int</span> ret<span class="token punctuation">;</span>
        <span class="token keyword">struct</span> <span class="token class-name">ProcessSignalInfo</span> info <span class="token operator">=</span> <span class="token punctuation">{</span>
            <span class="token punctuation">.</span>sigInfo <span class="token operator">=</span> sigInfo， <span class="token comment">//信号内容</span>
            <span class="token punctuation">.</span>defaultTcb <span class="token operator">=</span> <span class="token constant">NULL</span>， <span class="token comment">//以下四个值将在OsSigProcessForeachChild中根据条件完善</span>
            <span class="token punctuation">.</span>unblockedTcb <span class="token operator">=</span> <span class="token constant">NULL</span>，
            <span class="token punctuation">.</span>awakenedTcb <span class="token operator">=</span> <span class="token constant">NULL</span>，
            <span class="token punctuation">.</span>receivedTcb <span class="token operator">=</span> <span class="token constant">NULL</span>
        <span class="token punctuation">}</span><span class="token punctuation">;</span>
        <span class="token comment">//总之是要从进程中找个至少一个任务来接受这个信号，优先级</span>
        <span class="token comment">//awakenedTcb &gt; receivedTcb &gt; unblockedTcb &gt; defaultTcb</span>
        <span class="token comment">/* visit all taskcb and dispatch signal */</span> <span class="token comment">//访问所有任务和分发信号</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>info<span class="token punctuation">.</span>sigInfo <span class="token operator">!=</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token punctuation">(</span>info<span class="token punctuation">.</span>sigInfo<span class="token operator">-&gt;</span>si_signo <span class="token operator">==</span> SIGKILL<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//需要干掉进程时 SIGKILL = 9， #linux kill 9 14</span>
            <span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span><span class="token function">OsSigProcessForeachChild</span><span class="token punctuation">(</span>spcb， SigProcessKillSigHandler， <span class="token operator">&amp;</span>info<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//进程要被干掉了，通知所有task做善后处理</span>
            <span class="token function">OsSigAddSet</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>spcb<span class="token operator">-&gt;</span>sigShare， info<span class="token punctuation">.</span>sigInfo<span class="token operator">-&gt;</span>si_signo<span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token function">OsWaitSignalToWakeProcess</span><span class="token punctuation">(</span>spcb<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//等待信号唤醒进程</span>
            <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
        <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
            ret <span class="token operator">=</span> <span class="token function">OsSigProcessForeachChild</span><span class="token punctuation">(</span>spcb， SigProcessSignalHandler， <span class="token operator">&amp;</span>info<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//进程通知所有task处理信号</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>ret <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            <span class="token keyword">return</span> ret<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        <span class="token function">SigProcessLoadTcb</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>info， sigInfo<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">//让进程的每一个task执行参数函数</span>
    <span class="token keyword">int</span> <span class="token function">OsSigProcessForeachChild</span><span class="token punctuation">(</span>LosProcessCB <span class="token operator">*</span>spcb， ForEachTaskCB handler， <span class="token keyword">void</span> <span class="token operator">*</span>arg<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
        <span class="token keyword">int</span> ret<span class="token punctuation">;</span>
        <span class="token comment">/* Visit the main thread last (if present) */</span>	
        LosTaskCB <span class="token operator">*</span>taskCB <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span><span class="token comment">//遍历进程的 threadList 链表，里面存放的都是task节点</span>
        <span class="token function">LOS_DL_LIST_FOR_EACH_ENTRY</span><span class="token punctuation">(</span>taskCB， <span class="token operator">&amp;</span><span class="token punctuation">(</span>spcb<span class="token operator">-&gt;</span>threadSiblingList<span class="token punctuation">)</span>， LosTaskCB， threadList<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//遍历进程的任务列表</span>
            ret <span class="token operator">=</span> <span class="token function">handler</span><span class="token punctuation">(</span>taskCB， arg<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//回调参数函数</span>
            <span class="token function">OS_RETURN_IF</span><span class="token punctuation">(</span>ret <span class="token operator">!=</span> <span class="token number">0</span>， ret<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//这个宏的意思就是只有ret = 0时，啥也不处理。其余就返回 ret</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">return</span> LOS_OK<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br><span class="line-number">62</span><br><span class="line-number">63</span><br><span class="line-number">64</span><br><span class="line-number">65</span><br><span class="line-number">66</span><br><span class="line-number">67</span><br><span class="line-number">68</span><br><span class="line-number">69</span><br><span class="line-number">70</span><br><span class="line-number">71</span><br><span class="line-number">72</span><br><span class="line-number">73</span><br><span class="line-number">74</span><br><span class="line-number">75</span><br><span class="line-number">76</span><br><span class="line-number">77</span><br><span class="line-number">78</span><br><span class="line-number">79</span><br><span class="line-number">80</span><br><span class="line-number">81</span><br><span class="line-number">82</span><br><span class="line-number">83</span><br><span class="line-number">84</span><br></div></div><ul><li><p>如果是 <code>SIGKILL</code>信号，让<code>spcb</code>的所有任务执行<code>SigProcessKillSigHandler</code>函数，查看旗下的所有任务是否又在等待这个信号的，如果有就将任务唤醒，放在就绪队列等待被调度执行。</p> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token comment">//进程收到 SIGKILL 信号后，通知任务tcb处理.</span>
<span class="token keyword">static</span> <span class="token keyword">int</span> <span class="token function">SigProcessKillSigHandler</span><span class="token punctuation">(</span>LosTaskCB <span class="token operator">*</span>tcb， <span class="token keyword">void</span> <span class="token operator">*</span>arg<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">struct</span> <span class="token class-name">ProcessSignalInfo</span> <span class="token operator">*</span>info <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">struct</span> <span class="token class-name">ProcessSignalInfo</span> <span class="token operator">*</span><span class="token punctuation">)</span>arg<span class="token punctuation">;</span><span class="token comment">//转参</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>tcb <span class="token operator">!=</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token punctuation">(</span>info <span class="token operator">!=</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token punctuation">(</span>info<span class="token operator">-&gt;</span>sigInfo <span class="token operator">!=</span> <span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//进程有信号</span>
        sig_cb <span class="token operator">*</span>sigcb <span class="token operator">=</span> <span class="token operator">&amp;</span>tcb<span class="token operator">-&gt;</span>sig<span class="token punctuation">;</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">LOS_ListEmpty</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>sigcb<span class="token operator">-&gt;</span>waitList<span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token function">OsSigIsMember</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>sigcb<span class="token operator">-&gt;</span>sigwaitmask， info<span class="token operator">-&gt;</span>sigInfo<span class="token operator">-&gt;</span>si_signo<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//如果任务在等待这个信号</span>
            <span class="token function">OsTaskWake</span><span class="token punctuation">(</span>tcb<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//唤醒这个任务，加入进程的就绪队列，并不申请调度</span>
            <span class="token function">OsSigEmptySet</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>sigcb<span class="token operator">-&gt;</span>sigwaitmask<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//清空信号等待位，不等任何信号了。因为这是SIGKILL信号</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br></div></div></li> <li><p>非<code>SIGKILL</code>信号，让<code>spcb</code>的所有任务执行<code>SigProcessSignalHandler</code>函数</p> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token keyword">static</span> <span class="token keyword">int</span> <span class="token function">SigProcessSignalHandler</span><span class="token punctuation">(</span>LosTaskCB <span class="token operator">*</span>tcb， <span class="token keyword">void</span> <span class="token operator">*</span>arg<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">struct</span> <span class="token class-name">ProcessSignalInfo</span> <span class="token operator">*</span>info <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">struct</span> <span class="token class-name">ProcessSignalInfo</span> <span class="token operator">*</span><span class="token punctuation">)</span>arg<span class="token punctuation">;</span><span class="token comment">//先把参数解出来</span>
    <span class="token keyword">int</span> ret<span class="token punctuation">;</span>
    <span class="token keyword">int</span> isMember<span class="token punctuation">;</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>tcb <span class="token operator">==</span> <span class="token constant">NULL</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">/* If the default tcb is not setted， then set this one as default. */</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>info<span class="token operator">-&gt;</span>defaultTcb<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//如果没有默认发送方的任务，即默认参数任务。</span>
        info<span class="token operator">-&gt;</span>defaultTcb <span class="token operator">=</span> tcb<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    isMember <span class="token operator">=</span> <span class="token function">OsSigIsMember</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>tcb<span class="token operator">-&gt;</span>sig<span class="token punctuation">.</span>sigwaitmask， info<span class="token operator">-&gt;</span>sigInfo<span class="token operator">-&gt;</span>si_signo<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//任务是否在等待这个信号</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span>isMember <span class="token operator">&amp;&amp;</span> <span class="token punctuation">(</span><span class="token operator">!</span>info<span class="token operator">-&gt;</span>awakenedTcb<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//是在等待，并尚未向该任务时发送信号时</span>
        <span class="token comment">/* This means the task is waiting for this signal. Stop looking for it and use this tcb.
        * The requirement is: if more than one task in this task group is waiting for the signal，
        * then only one indeterminate task in the group will receive the signal.
        */</span>
        ret <span class="token operator">=</span> <span class="token function">OsTcbDispatch</span><span class="token punctuation">(</span>tcb， info<span class="token operator">-&gt;</span>sigInfo<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//发送信号，注意这是给其他任务发送信号，tcb不是当前任务</span>
        <span class="token function">OS_RETURN_IF</span><span class="token punctuation">(</span>ret <span class="token operator">&lt;</span> <span class="token number">0</span>， ret<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//这种写法很有意思</span>
        <span class="token comment">/* set this tcb as awakenedTcb */</span>
        info<span class="token operator">-&gt;</span>awakenedTcb <span class="token operator">=</span> tcb<span class="token punctuation">;</span>
        <span class="token function">OS_RETURN_IF</span><span class="token punctuation">(</span>info<span class="token operator">-&gt;</span>receivedTcb <span class="token operator">!=</span> <span class="token constant">NULL</span>， SIG_STOP_VISIT<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">/* Stop search */</span>
    <span class="token punctuation">}</span>
    <span class="token comment">/* Is this signal unblocked on this thread？ */</span>
    isMember <span class="token operator">=</span> <span class="token function">OsSigIsMember</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>tcb<span class="token operator">-&gt;</span>sig<span class="token punctuation">.</span>sigprocmask， info<span class="token operator">-&gt;</span>sigInfo<span class="token operator">-&gt;</span>si_signo<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//任务是否屏蔽了这个信号</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token operator">!</span>isMember<span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token punctuation">(</span><span class="token operator">!</span>info<span class="token operator">-&gt;</span>receivedTcb<span class="token punctuation">)</span> <span class="token operator">&amp;&amp;</span> <span class="token punctuation">(</span>tcb <span class="token operator">!=</span> info<span class="token operator">-&gt;</span>awakenedTcb<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token comment">//没有屏蔽，有唤醒任务没有接收任务。</span>
        <span class="token comment">/* if unblockedTcb of this signal is not setted， then set it. */</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>info<span class="token operator">-&gt;</span>unblockedTcb<span class="token punctuation">)</span> <span class="token punctuation">{</span>
            info<span class="token operator">-&gt;</span>unblockedTcb <span class="token operator">=</span> tcb<span class="token punctuation">;</span>
        <span class="token punctuation">}</span>
        ret <span class="token operator">=</span> <span class="token function">OsTcbDispatch</span><span class="token punctuation">(</span>tcb， info<span class="token operator">-&gt;</span>sigInfo<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//向任务发送信号</span>
        <span class="token function">OS_RETURN_IF</span><span class="token punctuation">(</span>ret <span class="token operator">&lt;</span> <span class="token number">0</span>， ret<span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token comment">/* set this tcb as receivedTcb */</span>
        info<span class="token operator">-&gt;</span>receivedTcb <span class="token operator">=</span> tcb<span class="token punctuation">;</span><span class="token comment">//设置这个任务为接收任务</span>
        <span class="token function">OS_RETURN_IF</span><span class="token punctuation">(</span>info<span class="token operator">-&gt;</span>awakenedTcb <span class="token operator">!=</span> <span class="token constant">NULL</span>， SIG_STOP_VISIT<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">/* Stop search */</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token comment">/* Keep searching */</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br></div></div><p><strong>解读</strong></p> <ul><li>函数的意思是，当进程中有多个任务在等待这个信号时，发送信号给第一个等待的任务<code>awakenedTcb</code>。</li> <li>如果没有任务在等待信号，那就从不屏蔽这个信号的任务集中随机找一个<code>receivedTcb</code>接受信号。</li> <li>只要不屏蔽 <code>unblockedTcb</code>就有值，随机的。</li> <li>如果上面的都不满足，信号发送给<code>defaultTcb</code>。</li> <li>寻找发送任务的优先级是 <code>awakenedTcb</code> &gt; <code>receivedTcb</code> &gt; <code>unblockedTcb</code> &gt; <code>defaultTcb</code></li></ul></li></ul> <h3 id="信号相关函数">信号相关函数</h3> <p>信号集操作函数</p> <ul><li>sigemptyset(sigset_t *set)：信号集全部清0；</li> <li>sigfillset(sigset_t *set)： 信号集全部置1，则信号集包含linux支持的64种信号；</li> <li>sigaddset(sigset_t *set， int signum)：向信号集中加入signum信号；</li> <li>sigdelset(sigset_t *set， int signum)：向信号集中删除signum信号；</li> <li>sigismember(const sigset_t *set， int signum)：判定信号signum是否存在信号集中。</li></ul> <p>信号阻塞函数</p> <ul><li>sigprocmask(int how， const sigset_t *set， sigset_t *oldset))； 不同how参数，实现不同功能
<ul><li>SIG_BLOCK：将set指向信号集中的信号，添加到进程阻塞信号集；</li> <li>SIG_UNBLOCK：将set指向信号集中的信号，从进程阻塞信号集删除；</li> <li>SIG_SETMASK：将set指向信号集中的信号，设置成进程阻塞信号集；</li></ul></li> <li>sigpending(sigset_t *set))：获取已发送到进程，却被阻塞的所有信号；</li> <li>sigsuspend(const sigset_t *mask))：用mask代替进程的原有掩码，并暂停进程执行，直到收到信号再恢复原有掩码并继续执行进程。</li></ul> <h3 id="百文说内核-抓住主脉络">百文说内核 | 抓住主脉络</h3> <ul><li>百文相当于摸出内核的肌肉和器官系统，让人开始丰满有立体感，因是直接从注释源码起步，在加注释过程中，每每有心得处就整理,慢慢形成了以下文章。内容立足源码，常以生活场景打比方尽可能多的将内核知识点置入某种场景，具有画面感，容易理解记忆。说别人能听得懂的话很重要! 百篇博客绝不是百度教条式的在说一堆诘屈聱牙的概念，那没什么意思。更希望让内核变得栩栩如生，倍感亲切。</li> <li>与代码需不断<code>debug</code>一样，文章内容会存在不少错漏之处，请多包涵，但会反复修正，持续更新，<code>v**.xx</code> 代表文章序号和修改的次数，精雕细琢，言简意赅，力求打造精品内容。</li> <li>百文在 &lt; 鸿蒙研究站 | 开源中国 | 博客园 | 51cto | csdn | 知乎 | 掘金 &gt; 站点发布，百篇博客系列目录如下。</li> <li><img src="https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/common/cate.png" alt=""></li></ul> <p>按功能模块:</p> <table><thead><tr><th style="text-align:center;">基础知识</th> <th style="text-align:center;">进程管理</th> <th style="text-align:center;">任务管理</th> <th style="text-align:center;">内存管理</th></tr></thead> <tbody><tr><td style="text-align:center;"><a href="http://weharmonyos.com/blog/01.html" target="_blank" rel="noopener noreferrer">双向链表</a><br><a href="http://weharmonyos.com/blog/02.html" target="_blank" rel="noopener noreferrer">内核概念</a><br><a href="http://weharmonyos.com/blog/03.html" target="_blank" rel="noopener noreferrer">源码结构</a><br><a href="http://weharmonyos.com/blog/04.html" target="_blank" rel="noopener noreferrer">地址空间</a><br><a href="http://weharmonyos.com/blog/05.html" target="_blank" rel="noopener noreferrer">计时单位</a><br><a href="http://weharmonyos.com/blog/06.html" target="_blank" rel="noopener noreferrer">优雅的宏</a><br><a href="http://weharmonyos.com/blog/07.html" target="_blank" rel="noopener noreferrer">钩子框架</a><br><a href="http://weharmonyos.com/blog/08.html" target="_blank" rel="noopener noreferrer">位图管理</a><br><a href="http://weharmonyos.com/blog/09.html" target="_blank" rel="noopener noreferrer">POSIX</a><br><a href="http://weharmonyos.com/blog/10.html" target="_blank" rel="noopener noreferrer">main函数</a><br></td> <td style="text-align:center;"><a href="http://weharmonyos.com/blog/11.html" target="_blank" rel="noopener noreferrer">调度故事</a><br><a href="http://weharmonyos.com/blog/12.html" target="_blank" rel="noopener noreferrer">进程控制块</a><br><a href="http://weharmonyos.com/blog/13.html" target="_blank" rel="noopener noreferrer">进程空间</a><br><a href="http://weharmonyos.com/blog/14.html" target="_blank" rel="noopener noreferrer">线性区</a><br><a href="http://weharmonyos.com/blog/15.html" target="_blank" rel="noopener noreferrer">红黑树</a><br><a href="http://weharmonyos.com/blog/16.html" target="_blank" rel="noopener noreferrer">进程管理</a><br><a href="http://weharmonyos.com/blog/17.html" target="_blank" rel="noopener noreferrer">Fork进程</a><br><a href="http://weharmonyos.com/blog/18.html" target="_blank" rel="noopener noreferrer">进程回收</a><br><a href="http://weharmonyos.com/blog/19.html" target="_blank" rel="noopener noreferrer">Shell编辑</a><br><a href="http://weharmonyos.com/blog/20.html" target="_blank" rel="noopener noreferrer">Shell解析</a><br></td> <td style="text-align:center;"><a href="http://weharmonyos.com/blog/21.html" target="_blank" rel="noopener noreferrer">任务控制块</a><br><a href="http://weharmonyos.com/blog/22.html" target="_blank" rel="noopener noreferrer">并发并行</a><br><a href="http://weharmonyos.com/blog/23.html" target="_blank" rel="noopener noreferrer">就绪队列</a><br><a href="http://weharmonyos.com/blog/24.html" target="_blank" rel="noopener noreferrer">调度机制</a><br><a href="http://weharmonyos.com/blog/25.html" target="_blank" rel="noopener noreferrer">任务管理</a><br><a href="http://weharmonyos.com/blog/26.html" target="_blank" rel="noopener noreferrer">用栈方式</a><br><a href="http://weharmonyos.com/blog/27.html" target="_blank" rel="noopener noreferrer">软件定时器</a><br><a href="http://weharmonyos.com/blog/28.html" target="_blank" rel="noopener noreferrer">控制台</a><br><a href="http://weharmonyos.com/blog/29.html" target="_blank" rel="noopener noreferrer">远程登录</a><br><a href="http://weharmonyos.com/blog/30.html" target="_blank" rel="noopener noreferrer">协议栈</a><br></td> <td style="text-align:center;"><a href="http://weharmonyos.com/blog/31.html" target="_blank" rel="noopener noreferrer">内存规则</a><br><a href="http://weharmonyos.com/blog/32.html" target="_blank" rel="noopener noreferrer">物理内存</a><br><a href="http://weharmonyos.com/blog/33.html" target="_blank" rel="noopener noreferrer">内存概念</a><br><a href="http://weharmonyos.com/blog/34.html" target="_blank" rel="noopener noreferrer">虚实映射</a><br><a href="http://weharmonyos.com/blog/35.html" target="_blank" rel="noopener noreferrer">页表管理</a><br><a href="http://weharmonyos.com/blog/36.html" target="_blank" rel="noopener noreferrer">静态分配</a><br><a href="http://weharmonyos.com/blog/37.html" target="_blank" rel="noopener noreferrer">TLFS算法</a><br><a href="http://weharmonyos.com/blog/38.html" target="_blank" rel="noopener noreferrer">内存池管理</a><br><a href="http://weharmonyos.com/blog/39.html" target="_blank" rel="noopener noreferrer">原子操作</a><br><a href="http://weharmonyos.com/blog/40.html" target="_blank" rel="noopener noreferrer">圆整对齐</a><br></td></tr> <tr><td style="text-align:center;">通讯机制</td> <td style="text-align:center;">文件系统</td> <td style="text-align:center;">硬件架构</td> <td style="text-align:center;">内核汇编</td></tr> <tr><td style="text-align:center;"><a href="http://weharmonyos.com/blog/41.html" target="_blank" rel="noopener noreferrer">通讯总览</a><br><a href="http://weharmonyos.com/blog/42.html" target="_blank" rel="noopener noreferrer">自旋锁</a><br><a href="http://weharmonyos.com/blog/43.html" target="_blank" rel="noopener noreferrer">互斥锁</a><br><a href="http://weharmonyos.com/blog/44.html" target="_blank" rel="noopener noreferrer">快锁使用</a><br><a href="http://weharmonyos.com/blog/45.html" target="_blank" rel="noopener noreferrer">快锁实现</a><br><a href="http://weharmonyos.com/blog/46.html" target="_blank" rel="noopener noreferrer">读写锁</a><br><a href="http://weharmonyos.com/blog/47.html" target="_blank" rel="noopener noreferrer">信号量</a><br><a href="http://weharmonyos.com/blog/48.html" target="_blank" rel="noopener noreferrer">事件机制</a><br><a href="http://weharmonyos.com/blog/49.html" target="_blank" rel="noopener noreferrer">信号生产</a><br><a href="http://weharmonyos.com/blog/50.html" target="_blank" rel="noopener noreferrer">信号消费</a><br><a href="http://weharmonyos.com/blog/51.html" target="_blank" rel="noopener noreferrer">消息队列</a><br><a href="http://weharmonyos.com/blog/52.html" target="_blank" rel="noopener noreferrer">消息封装</a><br><a href="http://weharmonyos.com/blog/53.html" target="_blank" rel="noopener noreferrer">消息映射</a><br><a href="http://weharmonyos.com/blog/54.html" target="_blank" rel="noopener noreferrer">共享内存</a><br></td> <td style="text-align:center;"><a href="http://weharmonyos.com/blog/55.html" target="_blank" rel="noopener noreferrer">文件概念</a><br><a href="http://weharmonyos.com/blog/56.html" target="_blank" rel="noopener noreferrer">文件故事</a><br><a href="http://weharmonyos.com/blog/57.html" target="_blank" rel="noopener noreferrer">索引节点</a><br><a href="http://weharmonyos.com/blog/58.html" target="_blank" rel="noopener noreferrer">VFS</a><br><a href="http://weharmonyos.com/blog/59.html" target="_blank" rel="noopener noreferrer">文件句柄</a><br><a href="http://weharmonyos.com/blog/60.html" target="_blank" rel="noopener noreferrer">根文件系统</a><br><a href="http://weharmonyos.com/blog/61.html" target="_blank" rel="noopener noreferrer">挂载机制</a><br><a href="http://weharmonyos.com/blog/62.html" target="_blank" rel="noopener noreferrer">管道文件</a><br><a href="http://weharmonyos.com/blog/63.html" target="_blank" rel="noopener noreferrer">文件映射</a><br><a href="http://weharmonyos.com/blog/64.html" target="_blank" rel="noopener noreferrer">写时拷贝</a><br></td> <td style="text-align:center;"><a href="http://weharmonyos.com/blog/65.html" target="_blank" rel="noopener noreferrer">芯片模式</a><br><a href="http://weharmonyos.com/blog/66.html" target="_blank" rel="noopener noreferrer">ARM架构</a><br><a href="http://weharmonyos.com/blog/67.html" target="_blank" rel="noopener noreferrer">指令集</a><br><a href="http://weharmonyos.com/blog/68.html" target="_blank" rel="noopener noreferrer">协处理器</a><br><a href="http://weharmonyos.com/blog/69.html" target="_blank" rel="noopener noreferrer">工作模式</a><br><a href="http://weharmonyos.com/blog/70.html" target="_blank" rel="noopener noreferrer">寄存器</a><br><a href="http://weharmonyos.com/blog/71.html" target="_blank" rel="noopener noreferrer">多核管理</a><br><a href="http://weharmonyos.com/blog/72.html" target="_blank" rel="noopener noreferrer">中断概念</a><br><a href="http://weharmonyos.com/blog/73.html" target="_blank" rel="noopener noreferrer">中断管理</a><br></td> <td style="text-align:center;"><a href="http://weharmonyos.com/blog/74.html" target="_blank" rel="noopener noreferrer">编码方式</a><br><a href="http://weharmonyos.com/blog/75.html" target="_blank" rel="noopener noreferrer">汇编基础</a><br><a href="http://weharmonyos.com/blog/76.html" target="_blank" rel="noopener noreferrer">汇编传参</a><br><a href="http://weharmonyos.com/blog/77.html" target="_blank" rel="noopener noreferrer">链接脚本</a><br><a href="http://weharmonyos.com/blog/78.html" target="_blank" rel="noopener noreferrer">内核启动</a><br><a href="http://weharmonyos.com/blog/79.html" target="_blank" rel="noopener noreferrer">进程切换</a><br><a href="http://weharmonyos.com/blog/80.html" target="_blank" rel="noopener noreferrer">任务切换</a><br><a href="http://weharmonyos.com/blog/81.html" target="_blank" rel="noopener noreferrer">中断切换</a><br><a href="http://weharmonyos.com/blog/82.html" target="_blank" rel="noopener noreferrer">异常接管</a><br><a href="http://weharmonyos.com/blog/83.html" target="_blank" rel="noopener noreferrer">缺页中断</a><br></td></tr> <tr><td style="text-align:center;">编译运行</td> <td style="text-align:center;">调测工具</td> <td style="text-align:center;"></td> <td style="text-align:center;"></td></tr> <tr><td style="text-align:center;"><a href="http://weharmonyos.com/blog/84.html" target="_blank" rel="noopener noreferrer">编译过程</a><br><a href="http://weharmonyos.com/blog/85.html" target="_blank" rel="noopener noreferrer">编译构建</a><br><a href="http://weharmonyos.com/blog/86.html" target="_blank" rel="noopener noreferrer">GN语法</a><br><a href="http://weharmonyos.com/blog/87.html" target="_blank" rel="noopener noreferrer">忍者无敌</a><br><a href="http://weharmonyos.com/blog/88.html" target="_blank" rel="noopener noreferrer">ELF格式</a><br><a href="http://weharmonyos.com/blog/89.html" target="_blank" rel="noopener noreferrer">ELF解析</a><br><a href="http://weharmonyos.com/blog/90.html" target="_blank" rel="noopener noreferrer">静态链接</a><br><a href="http://weharmonyos.com/blog/91.html" target="_blank" rel="noopener noreferrer">重定位</a><br><a href="http://weharmonyos.com/blog/92.html" target="_blank" rel="noopener noreferrer">动态链接</a><br><a href="http://weharmonyos.com/blog/93.html" target="_blank" rel="noopener noreferrer">进程映像</a><br><a href="http://weharmonyos.com/blog/94.html" target="_blank" rel="noopener noreferrer">应用启动</a><br><a href="http://weharmonyos.com/blog/95.html" target="_blank" rel="noopener noreferrer">系统调用</a><br><a href="http://weharmonyos.com/blog/96.html" target="_blank" rel="noopener noreferrer">VDSO</a><br></td> <td style="text-align:center;"><a href="http://weharmonyos.com/blog/97.html" target="_blank" rel="noopener noreferrer">模块监控</a><br><a href="http://weharmonyos.com/blog/98.html" target="_blank" rel="noopener noreferrer">日志跟踪</a><br><a href="http://weharmonyos.com/blog/99.html" target="_blank" rel="noopener noreferrer">系统安全</a><br><a href="http://weharmonyos.com/blog/100.html" target="_blank" rel="noopener noreferrer">测试用例</a><br></td> <td style="text-align:center;"></td> <td style="text-align:center;"></td></tr></tbody></table> <h3 id="百万注源码-处处扣细节">百万注源码 | 处处扣细节</h3> <ul><li><p>百万汉字注解内核目的是要看清楚其毛细血管，细胞结构，等于在拿放大镜看内核。内核并不神秘，带着问题去源码中找答案是很容易上瘾的，你会发现很多文章对一些问题的解读是错误的，或者说不深刻难以自圆其说，你会慢慢形成自己新的解读，而新的解读又会碰到新的问题，如此层层递进，滚滚向前，拿着放大镜根本不愿意放手。</p></li> <li><p><a href="https://gitee.com/weharmony/kernel_liteos_a_note" target="_blank" rel="noopener noreferrer">&lt; gitee</a> | <a href="https://github.com/kuangyufei/kernel_liteos_a_note" target="_blank" rel="noopener noreferrer">github</a> | <a href="https://weharmony.coding.net/public/harmony/kernel_liteos_a_note/git/files" target="_blank" rel="noopener noreferrer">coding</a> | <a href="https://gitcode.net/kuangyufei/kernel_liteos_a_note" target="_blank" rel="noopener noreferrer">gitcode &gt;</a> 四大码仓推送 | 同步官方源码。</p> <p><a href="https://gitee.com/weharmony/kernel_liteos_a_note" target="_blank" rel="noopener noreferrer"><img src="https://gitee.com/weharmony/kernel_liteos_a_note/widgets/widget_card.svg?colors=393222,ebdfc1,fffae5,d8ca9f,393222,a28b40" alt=""></a></p></li></ul> <h3 id="关注不迷路-代码即人生">关注不迷路 | 代码即人生</h3> <p><img src="https://weharmonyos.oss-cn-hangzhou.aliyuncs.com/resources/common/so1so.png" alt=""></p> <ul><li>互联网从业十五年，计算机硕士，技术副总裁</li> <li>关注我，持续更新四十年，即聊技术也聊人生</li> <li>交有趣靠谱的人；做难而正确的事</li> <li>不做作，不炒作，只唯真</li> <li>不唯上，不唯书，只唯实</li></ul> <p><a href="http://weharmonyos.com/donate.html" target="_blank" rel="noopener noreferrer"> &gt;&gt; 捐助名单</a></p> <p>据说喜欢 <strong>点赞 + 分享</strong> 的,后来都成了大神。😃</p></div> <!----> <div class="content__content-bottom"></div> <footer class="page-meta"><!----> <!----> <!----></footer> <div class="page-nav"><p class="inner"><span class="prev"><a href="/blog/48.html" class="prev"><svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon prev-icon"><path d="M906.783 588.79c-.02 8.499-6.882 15.36-15.38 15.37l-443.7-.01 75.704 191.682c2.52 6.42.482 13.763-5.038 17.91-5.52 4.168-13.138 4.147-18.616-.092L123.228 524.175a15.362 15.362 0 0 1-6-12.165c0-4.782 2.222-9.277 6-12.185L499.753 210.35a15.388 15.388 0 0 1 9.38-3.195c3.236 0 6.502 1.034 9.236 3.103 5.52 4.147 7.578 11.49 5.038 17.91L447.683 419.84l443.72-.01c8.498.01 15.36 6.881 15.36 15.36l.02 153.6z" fill="currentColor"></path></svg>
        事件机制
      </a></span> <span class="next"><a href="/blog/50.html">
        信号消费
        <svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" class="icon next-icon"><path d="M906.772 512c0 4.772-2.211 9.267-5.99 12.175L524.257 813.66a15.37 15.37 0 0 1-18.616.092 15.368 15.368 0 0 1-5.038-17.91l75.714-191.672h-443.73c-8.488 0-15.36-6.881-15.36-15.36v-153.6c0-8.489 6.872-15.36 15.36-15.36h443.73l-75.714-191.682a15.358 15.358 0 0 1 5.048-17.91c5.51-4.158 13.128-4.137 18.606.092l376.525 289.485a15.323 15.323 0 0 1 5.99 12.165z" fill="currentColor"></path></svg></a></span></p></div> <!----> <!----> <div class="content__page-bottom"></div></main> <!----></div><div class="global-ui"><!----><!----><div id="pwa-install"><!----> <div id="install-modal-wrapper" style="display:none;"><div class="background"></div> <div class="install-modal"><div class="header"><button aria-label="Close" class="close-button"><svg width="23" height="22" xmlns="http://www.w3.org/2000/svg" class="icon close-icon"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.12.358a1.224 1.224 0 011.729 0l8.92 8.914L20.686.358a1.224 1.224 0 011.73 1.728L13.497 11l8.92 8.913a1.222 1.222 0 11-1.73 1.729l-8.919-8.913-8.92 8.913a1.224 1.224 0 01-1.729-1.729L10.04 11l-8.92-8.914a1.222 1.222 0 010-1.728z" fill="currentColor"></path></svg></button> <div class="logo"><!----> <div class="title"><h1></h1> <p class="desc">This app can be installed on your PC or mobile device.  This will allow this web app to look and behave like any other installed app.  You will find it in your app lists and be able to pin it to your home screen, start menus or task bars.  This installed web app will also be able to safely interact with other apps and your operating system. </p></div></div></div> <div class="content"><div class="highlight"><!----> <!----></div> <div class="description"><h3>Description</h3> <p></p></div></div> <div class="button-wrapper"><button class="install-button">
        Install <span></span></button> <button class="cancel-button">
        Cancel
      </button></div></div></div></div><div tabindex="-1" role="dialog" aria-hidden="true" class="pswp"><div class="pswp__bg"></div> <div class="pswp__scroll-wrap"><div class="pswp__container"><div class="pswp__item"></div> <div class="pswp__item"></div> <div class="pswp__item"></div></div> <div class="pswp__ui pswp__ui--hidden"><div class="pswp__top-bar"><div class="pswp__counter"></div> <button title="Close" aria-label="Close" class="pswp__button pswp__button--close"></button> <button title="Share" aria-label="Share" class="pswp__button pswp__button--share"></button> <button title="Switch to full screen" aria-label="Switch to full screen" class="pswp__button pswp__button--fs"></button> <button title="Zoom in/out" aria-label="Zoom in/out" class="pswp__button pswp__button--zoom"></button> <div class="pswp__preloader"><div class="pswp__preloader__icn"><div class="pswp__preloader__cut"><div class="pswp__preloader__donut"></div></div></div></div></div> <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap"><div class="pswp__share-tooltip"></div></div> <button title="Prev (Arrow Left)" aria-label="Prev (Arrow Left)" class="pswp__button pswp__button--arrow--left"></button> <button title="Next (Arrow Right)" aria-label="Next (Arrow Right)" class="pswp__button pswp__button--arrow--right"></button> <div class="pswp__caption"><div class="pswp__caption__center"></div></div></div></div></div></div></div>
    <script src="/assets/js/app.9a8b95d8.js" defer></script><script src="/assets/js/vendors~layout-Layout.c1e797d4.js" defer></script><script src="/assets/js/vendors~layout-Blog~layout-Layout~layout-NotFound.f75cf258.js" defer></script><script src="/assets/js/page--340c7ba8.2c9570cb.js" defer></script>
  </body>
</html>
